/**
 ******************************************************************************
 * @file           : bsp_iic_gpio_config.h
 * @brief          : Software IIC Configuration File (STM32F1xx)
 ******************************************************************************
 * @attention
 *
 * GPIO模拟I2C（软件I2C）配置文件
 * 包含引脚定义、速度配置等硬件相关参数
 * 用户根据实际硬件修改此文件
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_IIC_GPIO_CONFIG_H
#define __BSP_IIC_GPIO_CONFIG_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx.h"

/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/

/* ============================================================================ */
/*                          依赖配置（移植时修改这里）                            */
/* ============================================================================ */

/**
 * 延时函数配置
 * 
 * 软件I2C需要微秒级延时函数，请根据你的项目修改：
 * 
 * 方案1：使用HAL库（推荐）
 *   #include "stm32f1xx_hal.h"
 *   内联汇编延时或HAL_Delay
 * 
 * 方案2：使用自定义延时
 *   #include "your_delay.h"
 *   #define IIC_DELAY_US(us)    your_delay_us(us)
 * 
 * 方案3：使用RTOS
 *   #include "cmsis_os.h"
 *   注意：us级延时在RTOS中可能不精确
 */

/* 默认实现：简单的软件延时（需要根据实际时钟频率调整） */
#ifndef IIC_DELAY_US
    #define IIC_DELAY_US(us)    do { \
        uint32_t temp = (us) * (SystemCoreClock / 8000000); \
        while(temp--); \
    } while(0)
#endif

/* 用户可以在工程中预先定义IIC_DELAY_US来覆盖默认实现 */

/* ============================================================================ */
/*                       日志系统配置（改这里的数字）                             */
/* ============================================================================ */
/* 日志后端选择：1=EasyLogger, 2=printf, 0=关闭 */
#define IIC_USE_LOG     1

/* 根据配置自动定义日志宏 */
#if (IIC_USE_LOG == 1)
    /* 使用EasyLogger */
    #ifndef LOG_TAG
        #define LOG_TAG    "IIC_GPIO"
    #endif
    #include "elog.h"
    
#elif (IIC_USE_LOG == 2)
    /* 使用printf */
    #include <stdio.h>
    #define log_i(fmt, ...)     printf(fmt "\r\n", ##__VA_ARGS__)
    #define log_w(fmt, ...)     printf("[WARN] " fmt "\r\n", ##__VA_ARGS__)
    #define log_e(fmt, ...)     printf("[ERROR] " fmt "\r\n", ##__VA_ARGS__)
    #define log_d(fmt, ...)     printf("[DEBUG] " fmt "\r\n", ##__VA_ARGS__)
    
#else
    /* 关闭日志 */
    #define log_i(fmt, ...)
    #define log_w(fmt, ...)
    #define log_e(fmt, ...)
    #define log_d(fmt, ...)
#endif

/* ============================================================================ */
/*                          硬件引脚配置（用户可修改）                            */
/* ============================================================================ */

/* IIC SCL引脚配置 */
#define IIC_SCL_GPIO_PORT               GPIOB                                           /*!< SCL引脚端口 */
#define IIC_SCL_GPIO_PIN                GPIO_PIN_6                                      /*!< SCL引脚号 */
#define IIC_SCL_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)     /*!< SCL端口时钟使能 */

/* IIC SDA引脚配置 */
#define IIC_SDA_GPIO_PORT               GPIOB                                           /*!< SDA引脚端口 */
#define IIC_SDA_GPIO_PIN                GPIO_PIN_7                                      /*!< SDA引脚号 */
#define IIC_SDA_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)     /*!< SDA端口时钟使能 */

/* ============================================================================ */
/*                          功能配置（用户可修改）                               */
/* ============================================================================ */

/* IIC通信速度配置 */
#define IIC_DELAY_TIME_US               2       /*!< IIC时序延时时间(us)，决定通信速度 */
                                                /*!< 2us对应约250KHz，1us对应约500KHz */

/* IIC超时配置 */
#define IIC_ACK_TIMEOUT                 250     /*!< ACK等待超时计数 */
#define IIC_MAX_RETRY                   3       /*!< 读写操作最大重试次数 */

/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

#ifdef __cplusplus
}
#endif

#endif /* __BSP_IIC_GPIO_CONFIG_H */
